package languageObject.metatModel;

import java.util.ArrayList;
import java.util.List;

import utils.Utils;

import languageObject.VisiteurObject;
import languageObject.metatModel.enumeration.TypeElementObject;

/**
 * element racine du system objet
 */
public class ElementObject 
{
	private TypeElementObject type;
	private String nom;
	private List<LiaisonElement> liaison;
	private List<SousElementObject> sousElement;
	private String note;
	
	/**
	 * constructeur par defaut
	 */
	public ElementObject() 
	{
		this.type = null;
		this.nom = null;
		this.liaison = null;
		this.sousElement = null;	
		this.note = null;
	}
	
	/**
	 * constructeur par recopie
	 */
	public ElementObject(TypeElementObject type, String nom, List<LiaisonElement> liaison, List<SousElementObject> sousElement, String note) 
	{
		this.type = type;
		this.nom = nom;
		this.liaison = liaison;
		this.sousElement = sousElement;
		this.note = note;
	}

	/**
	 * getter and setter.
	 */
	public TypeElementObject getType(){return type;}
	public void setType(TypeElementObject type){this.type = type;}

	public String getNom(){return nom;}
	public void setNom(String nom){this.nom = nom;}

	public List<LiaisonElement> getLiaison(){return liaison;}
	public void setLiaison(List<LiaisonElement> liaison){this.liaison = liaison;}
	public void addLiaison(LiaisonElement liaison)
	{
		if(this.liaison == null) this.liaison = new ArrayList<LiaisonElement>();
		this.liaison.add(liaison);
	}
	
	public List<SousElementObject> getSousElement(){return sousElement;}
	public void setSousElement(List<SousElementObject> sousElement){this.sousElement = sousElement;}
	public void addSousElement(SousElementObject sousElement)
	{
		if(this.sousElement == null) this.sousElement = new ArrayList<SousElementObject>();
		this.sousElement.add(sousElement);
	}
	
	public String getNote(){return note;}
	public void setNote(String note){this.note = note;}
	
	/**
	 * methode Objet
	 */
	public boolean equals(Object o)
	{
		if(o == null) return false;
		
		if(o instanceof ElementObject)
		{
			ElementObject objet = (ElementObject) o;
			
			if(!Utils.equals(this.getNom(), objet.getNom())) return false;
			if(!Utils.equals(this.getType(), objet.getType())) return false;
			if(!Utils.equals(this.getNote(), objet.getNote())) return false;
			if(!Utils.equalsList(this.getSousElement(), objet.getSousElement())) return false;
			if(!Utils.equalsList(this.getLiaison(), objet.getLiaison())) return false;
			
			return true;
		}
		
		return false;
	}
	
	/**
	 * visiteur object
	 * @param visiteur le visiteur
	 */
	public void visite(VisiteurObject visiteur)
	{
		if(visiteur != null) visiteur.ecriture(this);
	}
}
